package com.example.demo.common;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 跨域配置类
 * 该类用于配置 Spring 应用的跨域请求处理，通过定义一个 CorsFilter Bean 来实现。
 * 跨域资源共享（CORS）是一种机制，它使用额外的 HTTP 头来告诉浏览器 
 * 让运行在一个 origin (domain) 上的 Web 应用被准许访问来自不同源服务器上的指定的资源。
 */
@Configuration
public class CorsConfig {
    /**
     * 跨域配置方法，用于创建并返回一个 CorsFilter Bean。
     * 该方法会创建一个跨域配置对象，并设置允许的来源、请求头、请求方法等信息，
     * 然后将配置注册到基于 URL 的跨域配置源中，最后创建并返回一个 CorsFilter 实例。
     * 
     * @return 返回一个用于处理跨域请求的 CorsFilter 实例。
     */
    @Bean
    public CorsFilter corsFilter() {
        // 创建一个新的跨域配置对象，用于设置跨域请求的相关规则
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 添加允许的请求来源，由于设置了允许携带凭证，不能使用通配符 *，这里指定允许的来源为前端地址
corsConfiguration.addAllowedOrigin("http://localhost:5173");
// 添加允许的请求头，使用通配符 * 表示允许所有请求头
corsConfiguration.addAllowedHeader("*");
// 添加允许的请求方法，使用通配符 * 表示允许所有 HTTP 方法
corsConfiguration.addAllowedMethod("*");
// 设置是否允许携带凭证（如 Cookie 等），这里设置为允许
corsConfiguration.setAllowCredentials(true);

// 创建一个基于 URL 的跨域配置源对象，用于管理不同 URL 路径的跨域配置
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 将跨域配置注册到配置源中，使用通配符 /** 表示对所有 URL 路径都应用该跨域配置
source.registerCorsConfiguration("/**", corsConfiguration);

        // 返回一个新的 CorsFilter 实例，该过滤器会使用前面配置好的跨域规则来处理请求
        return new CorsFilter(source);
    }
}
